// std.h
#pragma once
#include <chrono>
#include <iostream>
#include <list>
#include <map>
#include <mutex>
#include <set>
#include <string>
#include <thread>
#include <vector>
#include "commondef.h"

using namespace std;

typedef pair<BYTE*, int> STD_DATA_BLOCK;
typedef vector<BYTE> STD_BUFFER;
typedef std::mutex STD_LOCK;
typedef std::recursive_mutex STD_REC_LOCK;
typedef chrono::system_clock::time_point STD_TIME_POINT;

#define STD_ARRAY  vector
#define STD_HEX(a) hex << a << dec // 用于cout<<

// 给STD_BUFFER赋值
#define STD_ASSIGN(buf, p, len)     \
    do                              \
    {                               \
        buf.resize(len);            \
        memcpy(buf.data(), p, len); \
    } while(0)
#define STD_ASSIGN_P(buf, p, len)        \
    do                                   \
    {                                    \
        if(buf)                          \
        {                                \
            buf->resize(len);            \
            memcpy(buf->data(), p, len); \
        }                                \
    } while(0)

// 连接
#define STD_CAT(a, b) a.insert(a.end(), b.begin(), b.end())

// 判断key是否存在于map中
#define STD_FOUND(m, k)     (m.find(k) != m.end())
#define STD_NOT_FOUND(m, k) (m.find(k) == m.end())

#define STD_NOW            chrono::system_clock::now()
#define STD_MILLISECOND(t) (chrono::duration_cast<chrono::milliseconds>(t).count())
#define STD_SLEEP_MS(t)    this_thread::sleep_for(chrono::milliseconds(t))

#define STD_TYPE_ID(p) (typeid(*p).hash_code()) // 传入父类指针，传出子类类型ID
